package com.briup.emdc.client.impl;

import com.briup.emdc.bean.Env;
import com.briup.emdc.client.Client;
import com.briup.emdc.client.Gather;
import com.briup.emdc.config.Backup;
import com.briup.emdc.config.Configuration;
import com.briup.emdc.config.Log;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Collection;
import java.util.Properties;

/**
 * @author Kevin
 * @since 2024.04.10
 **/
public class ClientImpl implements Client{
    private Log log;
    private Backup backup;
    private Gather gather;
    
    private String serverIp;
    private int serverPort;
    private String clientBackupPath;

    public void startClient() throws Exception{
        log.debug("创建了Gather的对象。");
        Collection<Env> envs=gather.gather();
        log.info("调用Gather中的gather方法，获取Collection集合。");

        this.send(envs);
        log.info("将集合中数据发送给服务器了");
    }

    /**
     * 网络模块的客户端代码
     *
     * @param coll
     *     客户端要发送给服务器的数据
     *
     */
    @Override
    public void send(final Collection<Env> coll){
        // socket对象在创建的时候就会去连接服务器
        // 如果连接成功，则该对象创建成功，反之创建失败
        try(Socket cs=new Socket(serverIp,serverPort)){
            // 在数据发送之前，将前一次备份的数据读取进来
            // 和当前要发送的数据进行合并，合并之后发送
            Collection<Env> envs=backup.load(clientBackupPath,true);
            coll.addAll(envs);

            OutputStream os=cs.getOutputStream();
            ObjectOutputStream oos=new ObjectOutputStream(os);

            // 模拟程序报错
            // int x = 10 / 0;
            // System.out.println(x);

            oos.writeObject(coll);
            oos.flush();
        }catch(Exception e){
            log.error("错误："+e.getMessage());
            log.error("发生异常，对数据进行备份");
            // 需要使用备份模块对未发送成功的数据做备份
            backup.save(coll,clientBackupPath,false);
            log.error("数据备份完成！");
        }
    }

    @Override
    public void init(final Properties prop){
        this.serverIp=prop.getProperty("server-ip");
        this.serverPort=Integer.parseInt(prop.getProperty("server-port"));
        this.clientBackupPath=prop.getProperty("client-backup-path");
    }

    @Override
    public void configure(final Configuration conf) throws Exception{
        this.log=conf.getLogger();
        this.backup=conf.getBackup();
        this.gather=conf.getGather();
    }
}
